Practical application development can lead to a task that appear to be general enough to extract an abstraction that is potentially useful for multiple applications. Bringing the solution to the level suitable for reusing (in contrast to an ad hoc solution for one particular application) can involve more efforts to extract variable details of the task and to express them in the pogramming language.
The talk describes three abstractions related to one common topic, namely storing data in a buffer within a multithreaded application. The way from task analysis to implementation in C++17 is shown. These etudes serve as a good example for some features of modern C++.